## Описание

Цель: научиться создавать защищенные (экранированные) друг от друга контексты
для библиотек, разделять код на два слоя абстракци (прикладной и системный) и
запускать прикладной код в искуственной среде, меняя его поведение по принципу
IoC из системного кода.

## Файлы

* `framework.js` - небольшая часть фреймворка, необходимая для демонстрации IoC
* `application.js` - часть приложения для демонстрации IoC

## Запуск

Из командной строки можно набрать `node ./framework.js` или `node framework`

## Задания

Вы можете выбрать минимум одно задание из предложенных, сделать себе форк этого
репозитория и написать код в своей ветке. Если кого-то задания окажутся
простыми, то переходите к дополнительным.

1. Пробросить в контекст приложения `setTimeout` и `setInterval` и использовать
их, выводя `console.log()` с таймера

2. Пробросить в контекст приложения библиотеку `util` и сделать вызовы
нескольких ее функций из приложения

3. Сделать возможность запускать фреймворк с разными приложениями, через
параметр командной строки: `node framework <applicationName>`

4. Обернуть вызов `console.log()` в песочнице приложения, чтобы добавить в
вывод дополнительные данные: `<applicationName> <time> <message>`

5. Обернуть вызов `console.log()` в песочнице приложения, для дублирования
записи в файл в формате: `<applicationName> <time> <message>`

6. Пробросить в приложение `require` и обернуть в песочнице для логирования,
вызывать и логировать вызовы в файл в формате: `<time> <module name>`

7. Экспортировать из приложения хеш с несколькими функциями и переменными и
распечатать их список из фреймворка с указанием типов

8. Экспортировать из приложения функцию и вывести из вфреймворка исходник
функции и кол-во ее параметров

9. Распечатать из приложения список всего, что находится в его глобальном
контексте (т.е. в песочнице приложения) с указанием типов данных

10. Сравнить ключи в контексте песочницы до загрузки приложения из фреймворка
и после этого, вывести разницу (какие ключи добавились, а какие удалены).

## Дополнительные задания

11. В своем коде вы можете скомбинировать несколько заданий из основного
списка на свое усмотрение, сделав более сложный пример взаимодействия
фреймворка с приложением, формировани среды исполнения (песочницы) или
запуска из командной строки

12. Написать аналогичный пример на другом языке программирования

13. Изучить, улучшить и/или оптимизировать код по работе с песочницами в
Impress Application Server, см.: [/lib/impress.application.js](https://github.com/tshemsedinov/impress/blob/master/lib/impress.application.js)

14. Использовать принципы IoC и изоляции кода через контексты, песочницы
и/или другие аналогичные механизны в своем проекте (на любом стеке технологий)
и продемонстрировать его работу и эффект использования IoC
